

# 不懂很正常，现在只需要知道，写什么会得到什么结果就行了

# 这是一个操作mysql的包
# pip3 install pymysql
import pymysql
from datetime import datetime

# 数据库对象 db （database）
class db:
    # 连接
    query = None

    # 构造方法，在对象被实例化时会自动执行
    def __init__(self):
        self.query = pymysql.connect(
            host = 'localhost',     # 数据库地址， localhost（等同于127.0.0.1） 是本机的意思
            port = 8001,            # 端口，MySQL默认3306（如果没有去修改的话）
            user = 'zyxk',          # 数据库的账号
            password = 'zyxk',      # 数据库密码
            db ='zyxk',             # 库名
            charset = 'utf8mb4'     # 字符集
        )

    # 获取格式化后的时间
    def now(self):
        # 获取当前时间
        now = datetime.now()
        # 将时间格式化为 Y-m-d H:i:s 格式
        return now.strftime('%Y-%m-%d %H:%M:%S')

    # 查询方法
    def __get(self, sql):
        # print("执行语句：" + sql)
        # 操作对象
        obj = self.query.cursor()
        # 执行查询
        obj.execute(sql)
        data = obj.fetchall()

        # obj.description 获取列名(字段名)
        # 通过 for in 将字段遍历给 columns
        columns = [column[0] for column in obj.description]
        # 将结果转换为字典列表
        rowsDict = []
        for row in data:
            field = dict(zip(columns, row)) # 构建字段映射
            rowsDict.append(field)          # 写入到 rowsDict 字典结果中
        return rowsDict

    # 读取符合条件的一条数据
    def getOne(self, sql):
        rowsDict = self.__get(sql)
        if len(rowsDict) == 0:
            print("查无数据")
            return None
        return rowsDict[0]  # 只获取第一个

    # 读取符合条件的所有数据
    def getAll(self, sql):
        rowsDict = self.__get(sql)
        return rowsDict  # 返回全部

    # 写入数据
    def add(self, table, keyValue):
        field = ""  # 所有字段
        value = ""  # 所有的值
        # 循环，组装 字符串
        for i in keyValue:
            field += ',' + i
            value += ", '{}'".format(keyValue[i])
        # 删除开头的 , 号
        field = field[1:]
        value = value[1:]

        sql = "insert {} ({}) values ({})".format(table, field, value)
        print(sql)
        # 执行sql
        # 操作对象
        obj = self.query.cursor()
        # # 执行
        obj.execute(sql)
        # 提交更改
        self.query.commit()


    # 更新数据
    def update(self, sql):
        # 数据库操作对象
        query = self.query.cursor()
        # 执行sql (mysql命令)
        query.execute(sql)
        # 提交更改，确认执行
        self.query.commit()

    # 删除数据
    def delete(self, sql):
        # 数据库操作对象
        query = self.query.cursor()
        # 执行sql (mysql命令)
        query.execute(sql)
        # 提交更改，确认执行
        self.query.commit()

# 实例化对象
query = db()
# 查询一条数据
# one = query.getOne("select * from students where name like '%陈%'")
# # print(one)
#
# # print(one['name'])
# # 查询符合条件的所有数据
# all = query.getAll("select * from students where addr = '少林寺'")
# # print(all[0]['name'])
#
# data = {
#     "name":"闹闹1",
#     "age":3,
#     "gender":1,
#     "addr":"幼儿园",
#     "status":1,
#     "created_at": query.now()
# }
# # 写入数据（新增）
# query.add('students', data)

# #更新数据
# sql = "update students set title = '祖国的花朵' where name = '闹闹' "
# # query.update(sql)
#
# # 删除
# sql = "delete from students where name = '闹闹1' "
# query.update(sql)

# 例子
# 要删除一个学生，以及和他关联的分数
# 1、查出这个学生的id来
student = query.getOne("select id from students where name = '闹闹'")
if student == None:
    print("数据不存在")
    exit() # 终止执行
id = student['id'] # 返回的是一个字典，取字典id
# 2、根据这个id，删除分数
sql = "delete from scores where student_id = " + str(id)
query.delete(sql)
# 3、删除学生自己
sql = "delete from students where id = "  + str(id)
query.delete(sql)


## 课堂练习
# 你家有几个调皮的弟弟妹妹，他们有了电脑后，经常用浏览器看一些不可描述的东西
# 现在我们要做一个系统，功能是记录他们的浏览器访问历史
# 所记录的数据至少要有：电脑编号、电脑系统名称(system_version)、浏览器名称、网站名、网站地址、日期、打开网站时间、关闭网站时间
# 根据以上条件，创建数据库和表

# 3张表:
# 弟妹表：
# 电脑表、
# 浏览记录表

# 大弟‘闹闹’，
# 在 2024-07-27 07:10:00，在win10电脑，用UC浏览器打开了【天线宝宝】(txbb.com), 直到 2024-07-27 08:30:00才关掉

# 大弟‘闹闹’，
# 在 2024-07-28 23:10:00 在win10电脑，用UC浏览器打开了【宝宝巴士】(bbbus.com), 直到 2024-07-29 02:30:00才关掉

# 小妹‘团团’
# 在 2024-07-29 11:05:00 在Mac电脑，用火狐浏览器打开了【核弹的生产规范】(hd.com), 直到 2024-07-29 16:30:00才关掉
